package com.example.lambda

import org.junit.Test


/**
 * 模拟安卓点击事件管理
 *
 * @author zhouronghua
 * @time 2022/3/26 11:51 上午
 */
class AndroidClickListener<T> {

    /**
     * 事件集合
     */
    private var actions = arrayListOf<(T?) -> Unit>()

    /**
     * 数据集合：标记谁触发了事件
     */
    private var values = arrayListOf<T?>()

    /**
     * 添加事件
     *
     *
     */
    fun addListener(value: T?, action: (T?) -> Unit) {
        if (!actions.contains(action)) {
            actions += action // 添加事件到集合
            values += value // 添加数据到集合
        }
    }

    /**
     * 触发点击事件
     */
    fun touchListener() {
        if (actions.isEmpty()) {
            println("您还没有注册事件")
            return
        }
        actions.forEachIndexed { index, action ->
            // 逐个调用事件处理
            action.invoke(values[index])
        }
    }

    @Test
    fun testClick() {
        println("==未注册事件再测试==")
        val func = AndroidClickListener<String>()
        func.touchListener()
        println("==注册事件再测试==")
        // 注册一些事件监听
        func.addListener("丽丽") {
            println("$it 触发了点击事件")
        }
        func.addListener("明明") {
            println("$it 触发了点击事件")
        }
        func.addListener("小美") {
            println("$it 快速触发了点击事件")
        }
        func.touchListener()
        // Lambda中无法接受泛型，泛型参数可以使用Any
        val method01: (value: T) -> String = {
            "输入的泛型类型参数是$it  "
        }
//        println(method01())
//        val method02: (value: Any) -> String = {
//
//        }
    }
}